package com.yuandian.business.monitor.service.impl;

import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import com.yuandian.api.business_monitor.vo.IndexVisitCount;
import com.yuandian.enums.HisIndicatorEnum;
import com.yuandian.business.monitor.mapper.IndexMapper;
import com.yuandian.business.monitor.service.IIndexService;
import com.yuandian.api.business_monitor.vo.IndexChartsVo;
import com.yuandian.api.business_monitor.po.IndexParams;
import com.yuandian.constant.Constants;
import com.yuandian.enums.BaseTableName;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;


/**
 * 说明：首页service实现
 *
 * @Author yanjun
 * @Date 2020/12/14 10:59
 */
@Slf4j
@Service
public class IndexServiceImpl implements IIndexService {

	@Autowired
	private IndexMapper indexMapper;


	/**
	 * 查询系统访问量趋势
	 *
	 * @param params 首页搜索条件
	 * @return 首页图表vo对象集合
	 */
//    @DS("bpmData")
	@Override
	public IndexVisitCount querySystemVisitTrend(IndexParams params) {
		List<IndexChartsVo> icVoList = new ArrayList<>();
		params.setTrendTableName(BaseTableName.BUSI_SYS_VISIT_TREND_M.getName());
		// 1、查询当前趋势
		icVoList = indexMapper.queryCurrentSystemVisitTrend(params);
		//2、查询历史值
		params.setHisTableName(BaseTableName.BUSI_SYSTEM_INDICATOR_HISTORY_M.getName());
		params.setIndicatorType(HisIndicatorEnum.VISIT_COUNT.getType());
		List<IndexChartsVo> hisVoList = indexMapper.querySystemHisTrend(params);
		//3、查询历史峰值
		IndexVisitCount indexVisitCount = indexMapper.queryMaxCurrentSystemVisit(params);
		if(ObjectUtil.isEmpty(indexVisitCount)){
			indexVisitCount = new IndexVisitCount();
		}
		//如果历史值为空，只展示当前值
		if (ObjectUtil.isNotEmpty(hisVoList)) {
			// 3、合并数据
			mergeIcVoList(icVoList, hisVoList);
		}
		indexVisitCount.setList(icVoList);
		return indexVisitCount;
	}

	/**
	 * 查询系统平均响应时长趋势
	 *
	 * @param params 首页搜索条件
	 * @return 首页图表vo对象集合
	 */
	@Override
	public List<IndexChartsVo> querySystemAvgDealTimeTrend(IndexParams params) {
		List<IndexChartsVo> icVoList = new ArrayList<>();

		// 1、设置当前趋势表名
//		params.setTrendTableName(BaseTableName.BUSI_SYS_VISIT_TREND_M.getName());
		// 2、查询当前趋势
		icVoList = indexMapper.queryCurrentSystemAvgDealTimeTrend(params);
		// 3、设置历史趋势表名
		params.setHisTableName(BaseTableName.BUSI_SYSTEM_INDICATOR_HISTORY_M.getName());
		// 4、查询历史值
		params.setIndicatorType(HisIndicatorEnum.AVG_DEAL_TIME.getType());
		List<IndexChartsVo> hisVoList = indexMapper.querySystemHisTrend(params);
		// 历史值为空，只展示当前值
		if (CollectionUtils.isEmpty(hisVoList)) {
			return icVoList;
		}
		//5、合并数据
		mergeIcVoList(icVoList, hisVoList);
		return icVoList;
	}

	/**
	 * 查询系统健康度趋势
	 *
	 * @param params 首页搜索条件
	 * @return 首页图表vo对象集合
	 */
	@Override
	public List<IndexChartsVo> querySystemHealthRatioTrend(IndexParams params) {
		List<IndexChartsVo> icVoList = new ArrayList<>();

		// 1、设置当前趋势表名
//		params.setTrendTableName(BaseTableName.BUSI_SYS_VISIT_TREND_M.getName());
		// 2、查询当前趋势
		icVoList = indexMapper.queryCurrentSystemHealthRatioTrend(params);

		// 3、设置历史趋势表名
		params.setHisTableName(BaseTableName.BUSI_SYSTEM_INDICATOR_HISTORY_M.getName());
		// 4、查询历史值
		params.setIndicatorType(HisIndicatorEnum.HEALTH_RATIO.getType());
		List<IndexChartsVo> hisVoList = indexMapper.querySystemHisTrend(params);
		// 历史值为空，只展示当前值
		if (CollectionUtils.isEmpty(hisVoList)) {
			return icVoList;
		}
		// 5、合并数据
		mergeIcVoList(icVoList, hisVoList);
		return icVoList;
	}

	/**
	 * 查询系统告警访问量趋势
	 *
	 * @param params 首页搜索条件
	 * @return 首页图表vo对象集合
	 */
	@Override
	public List<IndexChartsVo> querySystemAlarmTrend(IndexParams params) {
		List<IndexChartsVo> icVoList = new ArrayList<>();

		// 1、设置当前趋势表名
//		params.setTrendTableName(BaseTableName.BUSI_SYS_VISIT_TREND_M.getName());
		// 2、查询当前趋势
		icVoList = indexMapper.queryCurrentSystemAlarmTrend(params);
		// 3、设置历史趋势表名
//		params.setHisTableName(BaseTableName.BUSI_SYSTEM_INDICATOR_HISTORY_M.getName());
		// 4、查询历史值
		params.setIndicatorType(HisIndicatorEnum.ALARM_COUNT.getType());
		List<IndexChartsVo> hisVoList = indexMapper.querySystemHisTrend(params);
		// 5、历史值为空，只展示当前值
		if (CollectionUtils.isEmpty(hisVoList)) {
			return icVoList;
		}
		// 6、合并数据
		mergeIcVoList(icVoList, hisVoList);
		return icVoList;
	}


	/**
	 * 合并当前趋势和历史趋势数据
	 *
	 * @param icVoList  当前趋势数据
	 * @param hisVoList 历史趋势数据
	 */
	private void mergeIcVoList(List<IndexChartsVo> icVoList, List<IndexChartsVo> hisVoList) {

		//根据labelTime进行分组
		Map<String, IndexChartsVo> hisLabelTimeMap = hisVoList
				.stream()
				.collect(Collectors.toMap(IndexChartsVo::getLabelTime, v -> v, (k1, k2) -> k1));
		Map<String, IndexChartsVo> labelTimeMap = icVoList
				.stream()
				.collect(Collectors.toMap(IndexChartsVo::getLabelTime, v -> v, (k1, k2) -> k1));
		// 合并数据
		for (IndexChartsVo hisVo : hisVoList) {
			IndexChartsVo icVo = labelTimeMap.get(hisVo.getLabelTime());
			if (icVo != null) {
				icVo.setYesterdayValue(hisVo.getYesterdayValue());
				icVo.setMaxValue(hisVo.getMaxValue());
				icVo.setMinValue(hisVo.getMinValue());
			}
		}
		//如果历史趋势中有当前趋势外的数据则新建当前趋势对象
		for (Map.Entry<String, IndexChartsVo> entry : hisLabelTimeMap.entrySet()) {
			if (!labelTimeMap.containsKey(entry.getKey())) {
				IndexChartsVo icVo = new IndexChartsVo();
				icVo.setCurrentValue("0.00");
				icVo.setYesterdayValue(entry.getValue().getYesterdayValue());
				icVo.setMaxValue(entry.getValue().getMaxValue());
				icVo.setMinValue(entry.getValue().getMinValue());
				icVo.setLabelTime(entry.getKey());
				icVoList.add(icVo);
			}
		}
		//按时间升序排序
		icVoList.sort((a, b) -> {
			try {
				return (int) (DateUtil.parse(a.getLabelTime().replace(".0", ""), Constants.YYYY_MM_DD_HH_MM_SS).getTime() - DateUtil.parse(b.getLabelTime().replace(".0", ""), Constants.YYYY_MM_DD_HH_MM_SS).getTime());
			} catch (Exception e) {
				e.printStackTrace();
				throw new RuntimeException(e);
			}
		});
	}


}
